{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "61ebaac8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from io import StringIO\n",
    "\n",
    "def load_and_prepare_data():\n",
    "    \"\"\"加载数据集并分割特征与目标变量\"\"\"\n",
    "    # 内置提供的数据集\n",
    "    data_str = \"\"\"6.1101,17.592\n",
    "5.5277,9.1302\n",
    "8.5186,13.662\n",
    "7.0032,11.854\n",
    "5.8598,6.8233\n",
    "8.3829,11.886\n",
    "7.4764,4.3483\n",
    "8.5781,12\n",
    "6.4862,6.5987\n",
    "5.0546,3.8166\n",
    "5.7107,3.2522\n",
    "14.164,15.505\n",
    "5.734,3.1551\n",
    "8.4084,7.2258\n",
    "5.6407,0.71618\n",
    "5.3794,3.5129\n",
    "6.3654,5.3048\n",
    "5.1301,0.56077\n",
    "6.4296,3.6518\n",
    "7.0708,5.3893\n",
    "6.1891,3.1386\n",
    "20.27,21.767\n",
    "5.4901,4.263\n",
    "6.3261,5.1875\n",
    "5.5649,3.0825\n",
    "18.945,22.638\n",
    "12.828,13.501\n",
    "10.957,7.0467\n",
    "13.176,14.692\n",
    "22.203,24.147\n",
    "5.2524,-1.22\n",
    "6.5894,5.9966\n",
    "9.2482,12.134\n",
    "5.8918,1.8495\n",
    "8.2111,6.5426\n",
    "7.9334,4.5623\n",
    "8.0959,4.1164\n",
    "5.6063,3.3928\n",
    "12.836,10.117\n",
    "6.3534,5.4974\n",
    "5.4069,0.55657\n",
    "6.8825,3.9115\n",
    "11.708,5.3854\n",
    "5.7737,2.4406\n",
    "7.8247,6.7318\n",
    "7.0931,1.0463\n",
    "5.0702,5.1337\n",
    "5.8014,1.844\n",
    "11.7,8.0043\n",
    "5.5416,1.0179\n",
    "7.5402,6.7504\n",
    "5.3077,1.8396\n",
    "7.4239,4.2885\n",
    "7.6031,4.9981\n",
    "6.3328,1.4233\n",
    "6.3589,-1.4211\n",
    "6.2742,2.4756\n",
    "5.6397,4.6042\n",
    "9.3102,3.9624\n",
    "9.4536,5.4141\n",
    "8.8254,5.1694\n",
    "5.1793,-0.74279\n",
    "21.279,17.929\n",
    "14.908,12.054\n",
    "18.959,17.054\n",
    "7.2182,4.8852\n",
    "8.2951,5.7442\n",
    "10.236,7.7754\n",
    "5.4994,1.0173\n",
    "20.341,20.992\n",
    "10.136,6.6799\n",
    "7.3345,4.0259\n",
    "6.0062,1.2784\n",
    "7.2259,3.3411\n",
    "5.0269,-2.6807\n",
    "6.5479,0.29678\n",
    "7.5386,3.8845\n",
    "5.0365,5.7014\n",
    "10.274,6.7526\n",
    "5.1077,2.0576\n",
    "5.7292,0.47953\n",
    "5.1884,0.20421\n",
    "6.3557,0.67861\n",
    "9.7687,7.5435\n",
    "6.5159,5.3436\n",
    "8.5172,4.2415\n",
    "9.1802,6.7981\n",
    "6.002,0.92695\n",
    "5.5204,0.152\n",
    "5.0594,2.8214\n",
    "5.7077,1.8451\n",
    "7.6366,4.2959\n",
    "5.8707,7.2029\n",
    "5.3054,1.9869\n",
    "8.2934,0.14454\n",
    "13.394,9.0551\n",
    "5.4369,0.61705\"\"\"\n",
    "    \n",
    "    # 读取数据并转换为DataFrame\n",
    "    data = pd.read_csv(StringIO(data_str), header=None, names=[\"x\", \"y\"])\n",
    "    \n",
    "    # 分割特征（X）和目标变量（y），转换为numpy数组（便于矩阵运算）\n",
    "    X = data[\"x\"].values.reshape(-1, 1)  # 特征形状：[样本数, 1]\n",
    "    y = data[\"y\"].values.reshape(-1, 1)  # 目标变量形状：[样本数, 1]\n",
    "    \n",
    "    return X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c2849292",
   "metadata": {},
   "outputs": [],
   "source": [
    "def feature_standardization(X):\n",
    "    \"\"\"\n",
    "    特征标准化处理\n",
    "    参数：X - 原始特征数据\n",
    "    返回：标准化后的特征、均值、标准差\n",
    "    \"\"\"\n",
    "    # 计算每个特征的均值和标准差\n",
    "    mean = np.mean(X, axis=0)  # 按列计算均值\n",
    "    std = np.std(X, axis=0)    # 按列计算标准差\n",
    "    \n",
    "    # 避免标准差为0导致的除以0错误\n",
    "    std = np.where(std == 0, 1, std)\n",
    "    \n",
    "    # 标准化公式：(X - 均值) / 标准差\n",
    "    X_scaled = (X - mean) / std\n",
    "    \n",
    "    return X_scaled, mean, std\n",
    "\n",
    "\n",
    "def add_bias_term(X):\n",
    "    \"\"\"为特征矩阵添加偏置项（常数项theta0对应的列）\"\"\"\n",
    "    # 在特征矩阵前添加一列1（形状：[样本数, 1]）\n",
    "    X_with_bias = np.hstack((np.ones((X.shape[0], 1)), X))\n",
    "    return X_with_bias"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "2d72f0d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_loss(X, y, theta):\n",
    "    \"\"\"\n",
    "    计算线性回归的均方误差（MSE）损失\n",
    "    参数：\n",
    "        X - 特征矩阵（已添加偏置项）\n",
    "        y - 真实目标值\n",
    "        theta - 模型参数\n",
    "    返回：损失值（标量）\n",
    "    \"\"\"\n",
    "    m = len(y)  # 样本数量\n",
    "    y_pred = np.dot(X, theta)  # 预测值：X·theta（矩阵乘法）\n",
    "    loss = np.sum((y_pred - y) ** 2) / (2 * m)  # 均方误差公式\n",
    "    return loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "82baa781",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_descent(X, y, theta_initial, learning_rate, iterations):\n",
    "    \"\"\"\n",
    "    梯度下降法优化线性回归参数\n",
    "    参数：\n",
    "        X - 特征矩阵（已添加偏置项）\n",
    "        y - 真实目标值\n",
    "        theta_initial - 初始参数\n",
    "        learning_rate - 学习率\n",
    "        iterations - 迭代次数\n",
    "    返回：\n",
    "        theta_optimal - 优化后的参数\n",
    "        loss_history - 每次迭代的损失值\n",
    "    \"\"\"\n",
    "    m = len(y)  # 样本数量\n",
    "    theta = theta_initial  # 初始化参数\n",
    "    loss_history = []  # 记录损失变化\n",
    "    \n",
    "    for i in range(iterations):\n",
    "        # 1. 计算预测值\n",
    "        y_pred = np.dot(X, theta)\n",
    "        \n",
    "        # 2. 计算梯度（损失函数对theta的偏导数）\n",
    "        gradient = np.dot(X.T, (y_pred - y)) / m\n",
    "        \n",
    "        # 3. 更新参数（沿梯度负方向移动）\n",
    "        theta = theta - learning_rate * gradient\n",
    "        \n",
    "        # 4. 计算并记录当前损失\n",
    "        current_loss = compute_loss(X, y, theta)\n",
    "        loss_history.append(current_loss)\n",
    "        \n",
    "        # 每100次迭代打印进度\n",
    "        if (i + 1) % 100 == 0:\n",
    "            print(f\"迭代次数: {i+1:4d} | 损失值: {current_loss:.6f}\")\n",
    "    \n",
    "    return theta, loss_history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "c23e2ef9",
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(X_new, theta_optimal, mean, std):\n",
    "    \"\"\"\n",
    "    对新数据进行预测\n",
    "    参数：\n",
    "        X_new - 新特征数据\n",
    "        theta_optimal - 优化后的模型参数\n",
    "        mean - 训练集特征均值\n",
    "        std - 训练集特征标准差\n",
    "    返回：预测结果\n",
    "    \"\"\"\n",
    "    # 1. 用训练集的均值和标准差标准化新数据（避免数据泄露）\n",
    "    X_new_scaled = (X_new - mean) / std\n",
    "    \n",
    "    # 2. 添加偏置项（与训练时的特征格式保持一致）\n",
    "    X_new_with_bias = add_bias_term(X_new_scaled)\n",
    "    \n",
    "    # 3. 计算预测值\n",
    "    y_pred = np.dot(X_new_with_bias, theta_optimal)\n",
    "    \n",
    "    return y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c265f2b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "def set_plot_style():\n",
    "    \"\"\"设置绘图样式，确保中文正常显示\"\"\"\n",
    "    plt.rcParams[\"font.family\"] = [\"SimHei\", \"WenQuanYi Micro Hei\"]\n",
    "    plt.rcParams[\"axes.unicode_minus\"] = False  # 解决负号显示问题\n",
    "\n",
    "\n",
    "def visualize_results(X, y, y_pred, loss_history, iterations):\n",
    "    \"\"\"可视化损失收敛过程和预测效果\"\"\"\n",
    "    # 创建2个子图\n",
    "    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))\n",
    "    \n",
    "    # 子图1：损失函数收敛曲线\n",
    "    ax1.plot(range(1, iterations + 1), loss_history, color=\"blue\")\n",
    "    ax1.set_title(\"损失函数随迭代次数变化\")\n",
    "    ax1.set_xlabel(\"迭代次数\")\n",
    "    ax1.set_ylabel(\"均方误差损失\")\n",
    "    ax1.grid(True, alpha=0.3)\n",
    "    \n",
    "    # 子图2：真实值与预测值对比\n",
    "    ax2.scatter(X, y, color=\"orange\", alpha=0.6, label=\"真实值\")\n",
    "    ax2.plot(X, y_pred, color=\"green\", linewidth=2, label=\"预测直线\")\n",
    "    ax2.set_title(\"真实值与预测值对比\")\n",
    "    ax2.set_xlabel(\"特征x\")\n",
    "    ax2.set_ylabel(\"目标变量y\")\n",
    "    ax2.legend()\n",
    "    ax2.grid(True, alpha=0.3)\n",
    "    \n",
    "    # 调整布局\n",
    "    plt.tight_layout()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a7e92ecd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据加载完成，样本数量: 97\n",
      "\n",
      "开始梯度下降优化（学习率: 0.01, 迭代次数: 1000）\n",
      "迭代次数:  100 | 损失值: 8.174243\n",
      "迭代次数:  200 | 损失值: 4.972331\n",
      "迭代次数:  300 | 损失值: 4.543339\n",
      "迭代次数:  400 | 损失值: 4.485863\n",
      "迭代次数:  500 | 损失值: 4.478163\n",
      "迭代次数:  600 | 损失值: 4.477131\n",
      "迭代次数:  700 | 损失值: 4.476993\n",
      "迭代次数:  800 | 损失值: 4.476974\n",
      "迭代次数:  900 | 损失值: 4.476972\n",
      "迭代次数: 1000 | 损失值: 4.476971\n",
      "\n",
      "优化完成！最优参数：\n",
      "theta0（常数项）: 5.838883\n",
      "theta1（特征系数）: 4.592843\n",
      "最终损失值: 4.476971\n"
     ]
    },
    {
     "data": {
      "image/png": "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NfpRci4iIpJkStBFRERkPe5+ubs/HD0dBjQAB5jZPDO7xszUCk9ERCTJdHEVERGRNpnZzsBg4GHgL+6+yMyuA6YB97Ta90TgRIDRo0dTXV3d4liNjY0sX76c+vr6LsfR1NTE4sWLu1eIHFRaWkpRUWHVo9TU1GQ6hLQrtDIXWnmh8MpcaOWF5JdZCbqIiIgkZGZDgD8BhwCL3b022vQisFnr/d19DjAHYNKkSd560JyqqiqGDh3K0KFDMbMuxVJfX09paWnXC5GD3J1ly5axbNmyghtsqdDKC4VX5kIrLxRemQutvJDcMhfWrVkRERHpFDMrA24DfuXuHwLXm9lEMysGDgJe6+ox165d263kvNCYGUOHDu1WSwMREcltStBFREQkkROA7YAzzexx4E3geuBV4Dl3f6Q7B1Vy3jk6TyIihUlN3EVERGQ97n4FcEWr1bMyEUsq1dfXU1xcvK6/d0NDA0VFRaxevZr+/fsnfM3777/P4MGDGTx4cIv1tbW1Bdl3XEREkkdXEBERESkYTz31FPvssw/Tp09n1KhRXHPNNXz9619n6NChHHTQQRx00EE8++yz7L333jz++ON861vf4thjj+Wwww7jlVdeAeDaa6/llVdeob6+nkceeYTHH3+cxx9/nOOOO46f//zn654/8khzI4NPPvmEgw8+eN3zY445hn//+9/ccsstaT8HIiLSSdXz4IVT4LFpYVk9L+VvqQRdRERECsZuu+3GL37xCzbffHMuvfRSvv/973PvvfcyadIk7rrrLu677z6mTJnCAw88wOjRoykuLub8889n++23p7q6mq9+9auUlJRQVFREU1MTCxYsYPHixet+Ntxww3WPFyxYsO59L7vsMn784x9TVVUFhFHaBw8ezAcffMDChQszdTpERKQt1fPg9bOhthr6jgrL189OeZJeEAn6W2/Bz3/ej/nzMx2JiIiIZFrfvn3597//zTe+8Q2ef/55Jk+ezJgxY/j+97/PhAkTeP7555k3bx5f+tKXAPj+97/P8uXLKS0tpaysbN1xevXqxbHHHstdd93F1VdfzZtvvsk999zD1VdfzS233MKxxx4LwP/+9z9Wrly5bv9HHnmEd999l1/96le8++67nHvuuZk4DSIi0p6quVA2EMoGgRWFZdnAsD6FCqIP+rJl8Je/9OHQQ2HTTTMdjYiIiNis1AyC5jO93e033ngjc+bMwd2ZOnUq++23H9OmTaO8vJydd96ZBQsWsNVWW3HwwQevS9CLi4sZMGBAm8f84IMP+M1vftNi3S9+8YsW7/nss89y22238fjjj3P11VczfPhwTjvtNHbddVdee+01PvroIzbeeOMelFxERJJqVVWoOY9XOiCsT6GCSNCHDQvL6urMxiEiIiKZdcQRR3DkkUcyffp0ttxyS0aOHMn777/P4sWL181j279/f+655x5KSkpwd+rr69c9TqSxsZHFixe3WNfU1LTu8XnnncfBBx/Mww8/zJe+9CU22WQT5s2bx5lnnsnIkSPZaKONOP7441NXaBER6bryytCsvWxQ87r6FWF9ChVUgr50aWbjEBERkaCjmu7W6uvrKS0t7fH7xo+wfuGFF/Lyyy/z/vvv8/HHH7PxxhuvS8Lvvvtu3nnnHUpKSli5ciX9+/dfl6y3tnLlSq688soW6z777LN1j99++20OPfRQjjrqKG655RY233xzzjrrLB544AEmT57Mk08+yfjx43tcNhERSaLKGaHPOYSa8/oVUFcD409P6dsWRII+aBCUlDhLl2pOUREREQmKi4vp27cvY8aM4cknn6RXr17svPPONDU1cckll3D77bfz6quvcuedd1JVVcV3v/tdmpqaePrpp1scp1+/fnzzm99sse7aa69d93jw4MH87ne/Y+zYsfTv35/KykoaGxs55ZRTeOutt7jjjjvSUl4REemCiskwYXboc76qKtScjz89rE+hgkjQzWDIECXoIiIiAu6+rqZ8q6224tFHH2Wvvfbi6KOP5tRTT+Xqq69ml112oX///px99tnrBoG78sormT59OldffTV77bUXDQ0NmBllZWVsu+22Ld6jd+/eNDU10dTUxMsvv8yNN95IY2MjQ4YM4Te/+Q1nnXUWm2yyCePGjePdd9/l3XffXS/JFxGRDKuYnPKEvLWCSNABhg5tYunSghi0XkRERNpQV1fHLrvswhFHHEFjYyOnnnoqTU1NXH755axZs4bDDjuMc845h0MPPZQlS5Ywc+ZMRo8ezRlnnMGiRYv49NNP2W677Zg8eTI33XQTf/3rX+nXrx/nnHNOi/fp27cv++yzD4ceeigHH3wwW2yxBWPGjOHjjz9mzz335IILLuCAAw5g1qxZ7LXXXqpFFxERoMASdA0SJyIiUtjKysp48cUX1z0/66yzGDUqjNLbv39/br/9dnr16kVxcTGDBg1i02j6l7KyMsaMGcOYMWOYNGkSAMcccwzHHHNMl95/o4024rXXXsMstOqbOXMmv/jFL+jdu3cyiiciIjmuYKqUhw51DRInIiIiLcSS85i+fftSXFyc0veMJecxSs5FRCSmgBL0JiXoIiIiIiIikrUKJkGvqGji888hwewoIiIiIiIiIhlXMAn60KFhtNZlyzIciIiIiGSNxsbGdSO6t+WTTz6hrq6uze1r165d97i+vj7hXOkiIiKdUTCDxA0Z0gRAdTUMH57hYERERCQjGhoaeOaZZ9b1M//b3/5G3759mT59OgBFRUXssssuLV5z5plnss8++3DkkUcmPOZBBx3Er371K8aMGcNDDz3EU089xbnnnktjYyNjxoyhpKRgvm6JiEgPpeyKYWZDgO2BV9w94+OnV1SEu+Pqhy4iIlK43J3FixfTq1cvAN555x2mT59OdTTVS1FRaFy4+eabs9FGGwHwxRdf8N///pdrr70WgA8++ID33nsPgPnz59OrVy9qa2u57bbbeOGFF6itreX222+noaGBU045hf79+6e7mCIizarnQdVcWFUF5ZVQOSPtc3tL56UkQTezwcB9wP3AH8xsT+A3wJbA/e5+Xiretz1Dh4YadCXoIiIiOSLuS2VR341h0+N7/KWytLSUww47jO23335d4nz77bcDsGzZMt544w0ASkpKuPXWW3nnnXfYaaeduPXWW9liiy3YZptt2G677dYd74wzzmCLLbZg77335sILL2TBggUUFRVRU1PDr3/9ayXnIpJZ1fPg9bOhbCD0HQW11eH5hNlK0rNUqmrQJwA/cffno2R9T6DY3Xc2s2vNbDN3fzdF752QEnQREZEcst6XymVJ/VJZWlrK1KlTW6y777771j1+8MEHWbRoEXfccQf33XcfK1asYHjUR+7ll18G4LbbbuO1116jsrKSoqIiVq9ezfXXXw/A/fffz+eff97jOEVEeqRqbvg/WjYoPI8tq+YqQe8Ed+eJD59gmw22YWjfoWl5z5Qk6O7+BICZfQWYDAwBbo02PwRMAdZL0M3sROBEgNGjR69rbpYMxcU1wFA+/HAN1dVrknbcQlRTU5PpEPKKzmfy6Fwmj85l8uhcdlOiL5VFRUn9Uvn000+3eB4/WNzq1as577zzOOKI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\n",
      "text/plain": [
       "<Figure size 1008x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def main():\n",
    "    # 1. 初始化绘图样式\n",
    "    set_plot_style()\n",
    "    \n",
    "    # 2. 加载数据\n",
    "    X, y = load_and_prepare_data()\n",
    "    print(f\"数据加载完成，样本数量: {X.shape[0]}\")\n",
    "    \n",
    "    # 3. 特征预处理\n",
    "    X_scaled, mean, std = feature_standardization(X)  # 标准化\n",
    "    X_with_bias = add_bias_term(X_scaled)             # 添加偏置项\n",
    "    \n",
    "    # 4. 初始化模型参数\n",
    "    n_features = X_with_bias.shape[1]  # 特征数（含偏置项）\n",
    "    theta_initial = np.zeros((n_features, 1))  # 参数初始化为0\n",
    "    \n",
    "    # 5. 设置梯度下降超参数\n",
    "    learning_rate = 0.01\n",
    "    iterations = 1000\n",
    "    \n",
    "    # 6. 执行梯度下降优化\n",
    "    print(f\"\\n开始梯度下降优化（学习率: {learning_rate}, 迭代次数: {iterations}）\")\n",
    "    theta_optimal, loss_history = gradient_descent(\n",
    "        X=X_with_bias,\n",
    "        y=y,\n",
    "        theta_initial=theta_initial,\n",
    "        learning_rate=learning_rate,\n",
    "        iterations=iterations\n",
    "    )\n",
    "    \n",
    "    # 7. 输出优化结果\n",
    "    print(\"\\n优化完成！最优参数：\")\n",
    "    print(f\"theta0（常数项）: {theta_optimal[0][0]:.6f}\")\n",
    "    print(f\"theta1（特征系数）: {theta_optimal[1][0]:.6f}\")\n",
    "    print(f\"最终损失值: {loss_history[-1]:.6f}\")\n",
    "    \n",
    "    # 8. 模型预测\n",
    "    y_pred = predict(X, theta_optimal, mean, std)\n",
    "    \n",
    "    # 9. 可视化结果\n",
    "    visualize_results(X, y, y_pred, loss_history, iterations)\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    main()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "02931cf5",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
